home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_078 / mandelvroom / main.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  9KB  |  437 lines

  1. /***************************************************************************
  2.  *
  3.  *                         MandelZoom Main
  4.  *
  5.  *                         Kevin L. Clague
  6.  *
  7.  *                        Copyright (C) 1986
  8.  *
  9.  **************************************************************************/
  10.  
  11. #include "mand.h"
  12. #include <libraries/dosextens.h>
  13.  
  14. extern struct Menu Menu[], GenMenu[];
  15.  
  16. extern USHORT CmdMode;
  17.  
  18. extern SHORT CountX,CountY;
  19.  
  20. extern float StartX, StartY, EndX, EndY;
  21. extern LONG  NavTop,NavBot,NavRight,NavLeft;
  22. extern SHORT DragSize, BoxSizeX, BoxSizeY;
  23.  
  24. extern struct NewScreen NewScreen;
  25. extern struct Screen *screen;
  26.  
  27. extern struct Window *ContWind,*MandWind,*PalWind;
  28. extern struct NewWindow NewMand,NewCont,NewPal;
  29.  
  30. extern SHORT MaxCount;
  31.  
  32. extern SHORT *ContourBase;
  33. extern UBYTE *ColorBase;
  34.  
  35. struct IntuiMessage *message;
  36.  
  37. SHORT *CountBase = (SHORT *) NULL;
  38.  
  39. UBYTE  QuitScreen = FALSE;
  40.  
  41. UBYTE  MandType;
  42.  
  43. ULONG  BorderType = 0;
  44.  
  45. SHORT MouseX,MouseY;
  46.  
  47. SHORT Zoom = 0;
  48.  
  49. ULONG SaveIDCMP;
  50.  
  51. SHORT HotSpotX, HotSpotY;
  52.  
  53. struct Windows {
  54.   struct Windows *NextWindow;
  55.   struct Window  *Window;
  56. } *WindowList;
  57.  
  58. /*
  59.  * Do it all
  60.  */
  61. main () {
  62.   if (OpenLibs() == 0 && OpenDisp() == 0) {
  63.     InitPreset(0);
  64.     GenerateIt();
  65.     DoBrot();
  66.   }
  67.  
  68.   CloseDisp();
  69.  
  70.   if (CountBase) {
  71.     FreeMem(CountBase,CountX*CountY*sizeof(SHORT));
  72.   }
  73.  
  74.   CloseLibs();
  75. }
  76.  
  77. /*
  78.  * Decide what to do to satisfy this message
  79.  */
  80. DoBrot()
  81. {
  82.   ULONG   class;
  83.   USHORT  code = 0;
  84.   SHORT   ContNum;
  85.   struct  MenuItem *Item;
  86.   struct  Gadget *gadget;
  87.   struct  Windows *Windows;
  88.   struct  Window  *Window;
  89.   ULONG   WaitMask;
  90.  
  91. #define INTUINULL ((struct IntuiMessage *) NULL)
  92.  
  93.   extern struct MenuItem *ItemAddress();
  94.   extern struct IntuiMessage *GetMsg();
  95.  
  96.   if (WindowList == (struct Windows *) NULL) {
  97.     printf("Fatal programming error\nNo windows\n");
  98.     return(0);
  99.   }
  100.  
  101.   while (QuitScreen == FALSE) {
  102.  
  103.     /* grab the first window in the list */
  104.     Windows = WindowList;
  105.     Window  = Windows->Window;
  106.  
  107.     /* while we still have windows and there are no messages,
  108.        gather up the wait bit mask */
  109.  
  110.     WaitMask = 0;
  111.  
  112.     while (Windows && (message = GetMsg( Window->UserPort)) == INTUINULL ) {
  113.       /* Add to the wait mask */
  114.       WaitMask |= 1L << Window->UserPort->mp_SigBit;
  115.  
  116.       Windows = Windows->NextWindow;
  117.       Window  = Windows->Window;
  118.     }
  119.  
  120.     /* Wait here for a message */
  121.     if (message == (struct IntuiMessage *) NULL) {
  122.       Wait(WaitMask);
  123.       continue;
  124.     }
  125.  
  126.     /* got a message */
  127.     class  = message->Class;
  128.     code   = message->Code;
  129.     gadget = (struct Gadget *) message->IAddress;
  130.     MouseX = message->MouseX;
  131.     MouseY = message->MouseY;
  132.     ReplyMsg(message);
  133.  
  134.     if (class == MOUSEMOVE) {
  135.       DoMouseMove(MouseX, MouseY);   /* Try this first */
  136.     } else
  137.  
  138.     if (class == MENUPICK) {
  139.  
  140.       SetNormPointer();
  141.  
  142.       while (code != MENUNULL) {
  143.         switch (MENUNUM(code)) {
  144.           case PROJECTMENU:
  145.                ScreenProject(code);
  146.                break;
  147.           case EDITMENU:
  148.                EditScreen(code);
  149.                break;
  150.           case PRESETMENU:
  151.                SetPreset(ITEMNUM(code));
  152.                break;
  153.         }
  154.         Item = ItemAddress( (struct Menu *) &Menu[0], code);
  155.         code = Item->NextSelect;
  156.       }
  157.     } else
  158.  
  159.     if (class == GADGETDOWN) {
  160.       DoGadgetDown(gadget);
  161.     } else
  162.  
  163.     if (class == GADGETUP) {
  164.       DoGadgetUp(gadget);
  165.     } else
  166.  
  167.     if (class == MOUSEBUTTONS) {
  168.       DoMouseButtons(code);
  169.     } else
  170.  
  171.     if (class == CLOSEWINDOW) {
  172.       SetNormPointer();
  173.  
  174.       if (Windows->Window == ContWind) {
  175.         CloseContWind();
  176.  
  177.       } else
  178.       if (Windows->Window == PalWind) {
  179.         ClosePalWind();
  180.       }
  181.     }
  182.   }
  183. } /* DoBrot */
  184.  
  185. /*
  186.  * Perform functions for Gadget down messages
  187.  */
  188. DoGadgetDown(gadget)
  189.   struct Gadget *gadget;
  190.  
  191. {
  192.   switch (gadget->GadgetID >> WINDTYPEBITS & WINDMASK) {
  193.   case PALTYPE:
  194.        DoPalette(gadget);
  195.        break;
  196.  
  197.   case CONTYPE:
  198.        DoContourDown(gadget);
  199.        break;
  200.   }
  201. } /* DoGadgetDown */
  202.  
  203. /*
  204.  * Perform functions for Gadget up messages
  205.  */
  206. DoGadgetUp(gadget)
  207.   struct Gadget *gadget;
  208. {
  209.   switch (gadget->GadgetID >> WINDTYPEBITS & WINDMASK) {
  210.   case PALTYPE:
  211.        SetNormPointer();
  212.        break;
  213.  
  214.   case CONTYPE:
  215.        DoContourUp(gadget);
  216.        break;
  217.   }
  218. } /* DoGadgetUp */
  219.  
  220. /*
  221.  * Perform functions for Mouse buttons
  222.  */
  223. DoMouseButtons(code)
  224.   USHORT code;
  225. {
  226.   extern SHORT XScale, YScale;
  227.  
  228. #define MINXBOX (8 << XScale)
  229. #define MINYBOX (8 << YScale)
  230.  
  231.   switch (code) {
  232.   case SELECTDOWN:
  233.  
  234.        switch(CmdMode) {
  235.  
  236.        case IMPLIEDSET:
  237.             DoWindowPick(MouseX, MouseY);
  238.             CmdMode = NULL;
  239.             break;
  240.  
  241.        case STARTBOX:
  242.             StartZoomBox();
  243.             break;
  244.  
  245.        case NULL:            /* must be trying to move or resize with mouse */
  246.             DoZoomBoxGadgets();
  247.             break;
  248.        }
  249.        break;
  250.  
  251.   case SELECTUP:
  252.  
  253.        ModifyIDCMP(MandWind, MandWind->IDCMPFlags & ~MOUSEMOVE);
  254.  
  255.        switch(CmdMode) {
  256.  
  257.        case ZOOMDRAG:
  258.             CmdMode = NULL;
  259.  
  260.             /* redraw the extras */
  261.             DrawExtras(NavLeft, NavTop, NavRight, NavBot );
  262.             break;
  263.  
  264.        case STRETCHBOX:
  265.             DrawBox(NavLeft, NavTop, NavRight, NavBot );
  266.  
  267.             if ( NavRight - NavLeft < MINXBOX )
  268.               NavRight = NavLeft + MINXBOX;
  269.  
  270.             if ( NavBot - NavTop < MINYBOX )
  271.               NavBot = NavTop + MINYBOX;
  272.  
  273.             /* draw the extras */
  274.             DrawExtras(NavLeft, NavTop, NavRight, NavBot );
  275.  
  276.             DrawBox(NavLeft, NavTop, NavRight, NavBot );
  277.             CmdMode = NULL;
  278.             break;
  279.  
  280.        }
  281.  
  282.        SetNormPointer();
  283.  
  284.        break;
  285.   }
  286. } /* DoMouseButtons */
  287.  
  288. /*
  289.  * Start Zoom box
  290.  */
  291. StartZoomBox()
  292. {
  293.   if (Zoom == 0) {
  294.     if (MouseX > LEFTMARG && MouseX < MandWind->Width - RIGHTMARG &&
  295.         MouseY > TOPMARG  && MouseY < MandWind->Height - BOTMARG) {
  296.  
  297.       Zoom = 1;
  298.  
  299.       /* Draw first box */
  300.       NavTop   = MouseY;
  301.       NavLeft  = MouseX;
  302.       NavBot   = NavTop;
  303.       NavRight = NavLeft;
  304.       HotSpotX = HotSpotY = 0;
  305.       CmdMode = STRETCHBOX;
  306.  
  307.       DrawBox(NavLeft, NavTop, NavRight, NavBot );
  308.       ModifyIDCMP(MandWind, MandWind->IDCMPFlags | MOUSEMOVE);
  309.     }
  310.   }
  311. }
  312.  
  313. /*
  314.  * Simulate Zoom box gadgets
  315.  */
  316. DoZoomBoxGadgets()
  317. {
  318.   extern SHORT XScale, YScale;
  319.  
  320.   SetNormPointer();
  321.  
  322.   if ( Zoom == 1 ) {
  323.  
  324.     /* is it in the window box? */
  325.     if (MouseX >= NavLeft && MouseX <= NavRight &&
  326.         MouseY >= NavTop  && MouseY <= NavBot) {
  327.  
  328.       /* is it in the top part? */
  329.       if (MouseY <= NavTop + (3 << YScale)) {
  330.  
  331.         /* is it the drag bar? */
  332.         if (MouseX > NavLeft + (3 << XScale)) {
  333.  
  334.           HotSpotX = MouseX - NavLeft;
  335.           HotSpotY = MouseY - NavTop;
  336.  
  337.           /* undraw the extras */
  338.           DrawExtras(NavLeft, NavTop, NavRight, NavBot );
  339.           CmdMode = ZOOMDRAG;
  340.  
  341.         } else {                     /* We got the close gadget */
  342.           CmdMode = NULL;
  343.           DrawBox(NavLeft, NavTop, NavRight, NavBot );
  344.  
  345.           /* undraw the extras */
  346.           DrawExtras(NavLeft, NavTop, NavRight, NavBot );
  347.           Zoom = 0;
  348.         }
  349.       } else {
  350.  
  351.         /* is it the Resize Gadget? */
  352.         if (MouseY >= NavBot - (3 << YScale) &&
  353.             MouseX >= NavRight - (3 << XScale)) {
  354.  
  355.           HotSpotX = NavRight - MouseX;
  356.           HotSpotY = NavBot   - MouseY;
  357.  
  358.           CmdMode = STRETCHBOX;
  359.           /* undraw the extras */
  360.           DrawExtras(NavLeft, NavTop, NavRight, NavBot );
  361.         }
  362.       }
  363.     }
  364.   }
  365.   if (CmdMode) {
  366.     ModifyIDCMP(MandWind, MandWind->IDCMPFlags | MOUSEMOVE);
  367.   }
  368. }
  369.  
  370. /*
  371.  * Perform functions for Mouse movements
  372.  */
  373. DoMouseMove( MouseX, MouseY)
  374.   SHORT MouseX, MouseY;
  375. {
  376.   SHORT Width, Height;
  377.  
  378.   switch(CmdMode) {
  379.  
  380.   case COLORSLIDE:
  381.        ModifyColors();
  382.        break;
  383.  
  384.   case STRETCHBOX:
  385.  
  386.        DrawBox(NavLeft, NavTop, NavRight, NavBot );
  387.  
  388.        if ( MouseX < NavLeft )
  389.          MouseX = NavLeft;
  390.  
  391.        if ( MouseY < NavTop )
  392.          MouseY = NavTop;
  393.  
  394.        if ( MouseX + HotSpotX > CountX + LEFTMARG )
  395.          MouseX = CountX + LEFTMARG - HotSpotX;
  396.  
  397.        if ( MouseY + HotSpotY > CountY + TOPMARG )
  398.          MouseY = CountY + TOPMARG - HotSpotY;
  399.  
  400.        DrawBox(NavLeft, NavTop, MouseX, MouseY);
  401.  
  402.        NavBot   = MouseY;
  403.        NavRight = MouseX;
  404.        break;
  405.  
  406.   case ZOOMDRAG:
  407.        DrawBox(NavLeft, NavTop, NavRight, NavBot );
  408.  
  409.        Width  = NavRight - NavLeft - HotSpotX;
  410.        Height = NavBot - NavTop - HotSpotY;
  411.  
  412.        if ( MouseY < 1 )
  413.          MouseY = 1;
  414.  
  415.        if ( MouseX - HotSpotX < LEFTMARG )
  416.          MouseX = LEFTMARG + HotSpotX;
  417.  
  418.        if ( MouseY - HotSpotY < TOPMARG )
  419.          MouseY = TOPMARG + HotSpotY;
  420.  
  421.        if ( MouseX + Width > CountX + LEFTMARG )
  422.          MouseX = CountX + LEFTMARG - Width;
  423.  
  424.        if ( MouseY + Height > CountY + TOPMARG )
  425.          MouseY = CountY + TOPMARG - Height;
  426.  
  427.        NavLeft  = MouseX - HotSpotX;
  428.        NavTop   = MouseY - HotSpotY;
  429.  
  430.        NavRight = MouseX + Width;
  431.        NavBot   = MouseY + Height;
  432.  
  433.        DrawBox(NavLeft, NavTop, NavRight, NavBot );
  434.        break;
  435.   }
  436. } /* DoMouseMove */
  437.